/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: 23735
 * Date: 2022-10-24
 * Time: 19:24
 */

//懒汉模式实现线程安全的单例模式
public class Singleton {
    //volatile使内存可见,防止多次读instance内存时编译器进行优化为读寄存器,使得某个线程
    //实例化之后其他线程感知不到,此时第一个if语句不起作用,即对于每个线程都会进行加锁
    //此时代码效率就跟之前一样了
    //使用static创建实例,该实例就是该类的唯一实例,并不立即初始化
    private static volatile Singleton instance=null;
    //私有化构造方法,防止在类外创建实例
    private Singleton (){}
    //提供一个方法能够获取实例化对象
    //真正用到的时候在创建实例
    public static Singleton getInstance(){
        //为了提高效率,只需要第一个线程创建对象是需要加锁,
        // 之后都是只读取,本身就是线程安全操作,不需加锁
        if(instance==null) {
            //防止实例化多个对象,需要加锁
            //注意加锁的位置
            synchronized (Singleton.class) {//类对象只有一个,保证多个线程都是针对一个对象加锁
                if (instance == null) {//synchronized也会保证内存可见性
                    instance = new Singleton();
                }
            }
        }
        return instance;
    }
}
